/*
 * Exception.h
 *
 *  Created on: Apr 11, 2013
 *      Author: Lucifer
 */

#ifndef __BFX_EXCEPTION_H__
#define __BFX_EXCEPTION_H__

namespace BFX
{

//////////////////////////////////////////////////////////////////////////////

// NOTE: these classes need to handle lowest errors, so we can't use String class here.

// Exception

class BFX_API Exception
{
public:
	Exception();
	Exception(const char* pszMsg);
	Exception(const char* pszFile, int nLine, const char* pszFunc);
	Exception(const char* pszMsg, const char* pszFile, int nLine, const char* pszFunc);
	Exception(const Exception& e);
	virtual ~Exception() throw();

	virtual const char* GetMessage() const;
	virtual const char* GetExceptionName() const { return "Exception"; }

	const char* GetFileName() const { return m_pszFileName; }
	int GetLine() const { return m_nLine; }
	const char* GetFunctionName() const { return m_pszFunctionName; }

protected:
	char*	m_pszMessage;
	char*	m_pszFileName;
	int		m_nLine;
	char*	m_pszFunctionName;
};

//////////////////////////////////////////////////////////////////////////////
// Exception generate macros

#define	DEF_EXCEPTION_SIMPLE(class_name, base_class_name)	\
class BFX_API class_name : public base_class_name {	\
public:	\
	class_name()	\
		: base_class_name() {}	\
	class_name(const char* pszMsg)	\
		: base_class_name(pszMsg) {}	\
	class_name(const char* pszFile, int nLine, const char* pszFunc)	\
		: base_class_name(pszFile, nLine, pszFunc) {}	\
	class_name(const char* pszMsg, const char* pszFile, int nLine, const char* pszFunc)	\
		: base_class_name(pszMsg, pszFile, nLine, pszFunc) {}	\
	class_name(const class_name& e)	\
		: base_class_name(e) {}	\
	virtual ~class_name() throw() {}	\
	virtual const char* GetExceptionName() const { return #class_name; }	\
};	\

//////////////////////////////////////////////////////////////////////////////
// PreconditionException / PostconditionException

DEF_EXCEPTION_SIMPLE(PreconditionException, Exception)

DEF_EXCEPTION_SIMPLE(PostconditionException, Exception)

}	//	namespace BFX

#endif /* __BFX_EXCEPTION_H__ */
